package com.lone.design.pattern.creational.singleton.demo4;

import java.io.Serializable;

/**
 * @author Lone
 * @date 2021/9/24 9:19 周五
 * 内部静态类
 * 静态内部类单例模式中实例由内部类创建，由于 JVM 在加载外部类的过程中, 是不会加载静态内部类的,
 * 只有内部类的属性/方法被调用时才会被加载, 并初始化其静态属性。静态属性由于被 `static` 修饰，
 * 保证只被实例化一次，并且严格保证实例化顺序。
 */
public class Singleton implements Serializable {
    static final long serialVersionUID = 1L;

    private Singleton() {
        if (SingletonHolder.INSTANCE != null) {
            throw new RuntimeException("单例不允许创建多个实例!");
        }
    }

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }

    // 当进行反序列化时，会自动调用该方法，将该方法的返回值直接返回
    private Object readResolve() {
        return SingletonHolder.INSTANCE;
    }
}
